using System;
using System.Drawing;
using System.Globalization;
using System.Text;

namespace Puzzle.SourceCode.SyntaxDocumentExporters
{
	public class HTMLExporter2
	{
		private static StringBuilder sb = null;

		private static void write(string text, TextStyle s)
		{
			if (s != null)
			{
				if (s.Bold)
					Out("<b>");
				if (s.Italic)
					Out("<i>");
				if (s.Transparent)
					Out("<span style=\"color:" + GetHTMLColor(s.ForeColor) + "\">");
				else
					Out("<span style=\"color:" + GetHTMLColor(s.ForeColor) +
						";background-color:" + GetHTMLColor(s.BackColor) + ";\">");
			}

			text = text.Replace("&", "&amp;");
			text = text.Replace("<", "&lt;");
			text = text.Replace(">", "&gt;");
			text = text.Replace(" ", "&nbsp;");
			text = text.Replace("\t", "&nbsp;&nbsp;&nbsp;&nbsp;");
			Out(text);

			if (s != null)
			{
				Out("</span>");

				if (s.Italic)
					Out("</i>");
				if (s.Bold)
					Out("</b>");
			}
		}

		private static string GetHTMLColor(Color c)
		{
			return string.Format("#{0}{1}{2}", c.R.ToString("x2"), c.G.ToString("x2"),
			                     c.B.ToString("x2"));
		}

		private static void Out(string text)
		{
			sb.Append(text);
		}

		public static string Export(SyntaxDocument doc, string CssClass)
		{
			sb = new StringBuilder();
			doc.ParseAll(true);

			string guid = DateTime.Now.Ticks.ToString
				(CultureInfo.InvariantCulture);

			Out("<div class=\"" + CssClass + "\">" + Environment.NewLine);
			foreach (Row r in doc)
			{
				foreach (Word w in r)
				{
					write(w.Text, w.Style);
				}

				Out("<br>" + Environment.NewLine);
			}
			Out("</div>");

			return sb.ToString();
		}
	}
}